home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / cp1.zip / SGRID.C < prev    next >
C/C++ Source or Header  |  1993-05-15  |  4KB  |  132 lines

  1. ===========================================================================
  2.  BBS: The Abacus * HST/DS * Potterville MI
  3. Date: 05-13-93 (13:58)             Number: 55
  4. From: BRIAN GODETTE                Refer#: 167
  5.   To: STEVE HODSDON                 Recvd: NO  
  6. Subj: SHIFTING A GRID                Conf: (36) C Language
  7. ---------------------------------------------------------------------------
  8. >Moving left and right has got me stumped.  All I should need to do is t
  9. >the first (or last) bit, and shift the entire bitmap left (or right) by
  10. >bit, and restore the saved bit at the proper end.
  11. >
  12. >I can't see a 'C' solution to this.
  13. >
  14. >Anybody have any ideas, pointers to code, etc?
  15.  
  16. This code should work just fine, it's a bit "crude" but works. All it
  17. needs to know is how wide (counting from 1) the bitmap is and how many
  18. places to shift.
  19.  
  20. #include <dos.h>
  21. #include <string.h>
  22.  
  23. void  bitrlr(char *bv, int count, int len)
  24. {
  25.    char  c, *p1, *p2;
  26.    int   i, x;
  27.    unsigned val1, val2;
  28.  
  29.    if (!(count % 8)) /* special case shift by multiple of 8 */
  30.    {
  31.       for (i = 0; i < (count/8); i++)
  32.       {
  33.          c = bv[len-1];
  34.          p1 = &bv[len-1];
  35.          p2 = p1-1;
  36.          for (x = 0; x < len-1; x++)
  37.             *p1-- = *p2--;
  38.          bv[0] = c;
  39.       }
  40.    }
  41.    else
  42.    {
  43.       if (count > 8) /* special case shift by > 8 */
  44.       {
  45.          for (i = 0; i < (count/8); i++)
  46.          {
  47.             c = bv[len-1];
  48.             p1 = &bv[len-1];
  49.             p2 = p1-1;
  50.             for (x = 0; x < len-1; x++)
  51.                *p1-- = *p2--;
  52.             bv[0] = c;
  53.          }
  54.          count %= 8;
  55.       }
  56.       p1 = &bv[0];
  57.       val2 = (((unsigned)bv[len-1]) << (8-count)) & 0xff;
  58.       for (x = 0; x < len; x++, p1++)
  59.       {
  60.          val1 = ((unsigned)*p1) << (8-count);
  61.          *p1 = (val1 >> 8) | (val2 & 0xff);
  62.          val2 = val1 & 0xff;
  63.       }
  64.    }
  65. }
  66.  
  67. void  bitrll(char *bv, int count, int len)
  68. {
  69.    char  c, *p1;
  70.    int   i, x;
  71.    unsigned val1, val2;
  72.  
  73.    if (!(count % 8)) /* special case shift by multiple of 8 */
  74.    {
  75.       for (i = 0; i < (count/8); i++)
  76.       {
  77.          c = bv[0];
  78.          movedata(FP_SEG(bv+1), FP_OFF(bv+1),
  79.                   FP_SEG(bv), FP_OFF(bv), len-1);
  80.          bv[len-1] = c;
  81.       }
  82.    }
  83.    else
  84.    {
  85.       if (count > 8) /* special case shift by > 8 */
  86.       {
  87.          for (i = 0; i < (count/8); i++)
  88.          {
  89.             c = bv[0];
  90.             movedata(FP_SEG(bv+1), FP_OFF(bv+1),
  91.                      FP_SEG(bv), FP_OFF(bv), len-1);
  92.             bv[len-1] = c;
  93.          }
  94.          count %= 8;
  95.       }
  96.       p1 = &bv[len-1];
  97.       val2 = ((unsigned)bv[0]) >> (8-count);
  98.       for (x = 0; x < len; x++, p1--)
  99.       {
  100.          val1 = ((unsigned)*p1) << count;
  101.          *p1 = (val1 & 0xff) | (val2 & 0xff);
  102.          val2 = val1 >> 8;
  103.       }
  104.    }
  105. }
  106.  
  107. void main()
  108. {
  109.    char  test[] = "U\xaaU\xaaU\xaaU\xaa";
  110.  
  111.    bitrlr(test, 1, strlen(test));
  112.    bitrll(test, 1, strlen(test));
  113.  
  114.    bitrlr(test, 3, strlen(test));
  115.    bitrll(test, 3, strlen(test));
  116.  
  117.    bitrlr(test, 8, strlen(test));
  118.    bitrll(test, 8, strlen(test));
  119.  
  120.    bitrlr(test, 9, strlen(test));
  121.    bitrll(test, 9, strlen(test));
  122.  
  123.    bitrlr(test, 11, strlen(test));
  124.    bitrll(test, 11, strlen(test));
  125. }
  126.  
  127. --- UltraBBS v2.09
  128.  * Origin: The Eighth Dimension (303)-651-7745 (1:104/118.0)
  129. SEEN-BY: 1/211 11/2 4 13/13 101/1 108/89 109/25 110/69 114/5 123/19 124/1
  130. SEEN-BY: 153/752 154/40 77 157/2 159/100 125 575 950 203/23 209/209 261/1023
  131. SEEN-BY: 280/1 390/1 396/1 5 15 2270/1 2440/5 3603/20
  132.